#define _GNU_SOURCE // 声明可以使用系统库的扩展语法 gettid()
#include "pthread.h"
#include "stdio.h"
#include "unistd.h"
#include "mqueue.h"
#include "sys/time.h"

// 第一个线程的执行函数
void *thread1_run(void *arg)
{
    printf("thread1_run 线程1准备发送数据\n");

    // 打开消息队列
    mqd_t mq = mq_open("/my_mq", O_WRONLY);
    if (mq == -1)
    {
        perror("mq_open");
        return NULL;
    }

    // 发送数据
    char *msg = "hello, world";
    mq_send(mq, msg, strlen(msg) + 1, 0);

    return NULL;
}

// 第二个线程的执行函数
void *thread2_run(void *arg)
{
    printf("thread2_run 线程2准备接收数据\n");

    sleep(2);

    // 打开消息队列
    mqd_t mq = mq_open("/my_mq", O_RDONLY);
    if (mq == -1)
    {
        perror("mq_open");
        return NULL;
    }

    // 接收数据
    char msg[1024];
    mq_receive(mq, msg, 1024, NULL);
    printf("thread2_run 线程2接收数据: %s\n", msg);

    return NULL;
}

int main(int argc, char const *argv[])
{
    printf("main 主函数开始执行\n");

    // 设置队列属性
    struct mq_attr attr;
    attr.mq_maxmsg = 10;
    attr.mq_msgsize = 1024;

    // 创建或打开消息队列
    mqd_t mq = mq_open("/my_mq", O_CREAT | O_RDWR, 0666, &attr);
    if (mq == -1)
    {
        perror("mq_open");
        return -1;
    }

    // 创建两个分线程
    pthread_t thread1; // 类型是 unsigned long
    pthread_t thread2; // 类型是 unsigned long
    pthread_create(&thread1, NULL, thread1_run, NULL);
    pthread_create(&thread2, NULL, thread2_run, NULL);

    // 等待2个分线程执行完毕
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // 关闭消息队列
    mq_close(mq);

    // 删除消息队列
    mq_unlink("/my_mq");

    printf("main 主函数结束执行\n");

    return 0;
}